package com.zyy.study.always.code5;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * 题目名称：物流仓库管理系统
 * <p>
 * 问题描述
 * 您需要实现一个物流仓库管理系统，模拟仓库的货物存储和发货流程。系统包含：
 * <p>
 * 一个共享仓库（有容量限制）
 * 多个生产者线程（供货商向仓库添加货物）
 * 多个消费者线程（快递公司从仓库取货发货）
 * 实现要求
 * ​Warehouse类（共享仓库）​​：
 * 最大容量：10个货物
 * 使用数组或队列存储货物（简单的String标识即可）
 * 提供线程安全的put()和take()方法
 * 当仓库满时，生产者需等待
 * 当仓库空时，消费者需等待
 * ​Producer类（生产者）​​：
 * 每个生产者有唯一ID
 * 生产10个货物（格式："商品-生产者ID-序号"，如"货物-P1-01"）
 * 每次生产后随机休眠0.1-0.5秒
 * 仓库满时等待
 * ​Consumer类（消费者）​​：
 * 每个消费者有唯一ID
 * 不断尝试从仓库取货
 * 每次取货后随机休眠0.2-0.8秒
 * 仓库空时等待
 * ​统计功能​：
 * 记录每个生产者生产的商品数量
 * 记录每个消费者消费的商品数量
 * 程序运行结束后打印统计信息
 * ​同步机制​：
 * 使用Lock和Condition实现线程同步（不推荐使用synchronized）
 * 避免使用sleep()进行线程协调
 */
public class WarehouseSystem {
    public static void main(String[] args) throws InterruptedException {
        Warehouse warehouse = new Warehouse();
        Map<String, Object> consumerMap = new HashMap<>();
        Map<String, Object> producerMap = new HashMap<>();

        // 创建生产者
        Producer p1 = new Producer("P1", warehouse);
        Producer p2 = new Producer("P2", warehouse);
        Producer p3 = new Producer("P3", warehouse);

        // 创建消费者
        Consumer c1 = new Consumer("C1", warehouse);
        Consumer c2 = new Consumer("C2", warehouse);
        Consumer c3 = new Consumer("C3", warehouse);

        // 启动线程

        ExecutorService producerService = Executors.newFixedThreadPool(10);
        ExecutorService consumerService = Executors.newFixedThreadPool(10);

        producerService.execute(p1);
        producerService.execute(p1);
        producerService.execute(p1);
        producerService.execute(c2);
        producerService.execute(c2);
        producerService.execute(c1);
        Thread.sleep(1000);
        System.out.println(p1.getProducerCount());
        System.out.println(c2.getConsumerCount());
       /* // 等待生产者完成生产
        producerThread1.join();
        producerThread2.join();

        // 给消费者一些时间完成剩余工作
        Thread.sleep(2000);

        // 中断消费者线程
        consumerThread1.interrupt();
        consumerThread2.interrupt();
        consumerThread3.interrupt();

        // 等待消费者线程结束
        consumerThread1.join();
        consumerThread2.join();
        consumerThread3.join();*/

    }
}
